

LIST P=18F87J11
#include <P18F87J11.INC>

CONFIG	FOSC = HS
CONFIG	WDTEN = OFF
CONFIG	XINST = OFF



udata_acs 0
;-- pomocne registry pro preruseni
WREG_TMP		res 1;
STATUS_TEMP		res	1;
BSR_TEMP		res 1;
;-- pomocne registry pro preruseni s nizkou prioritou
WREG_TMP1		res 1;
STATUS_TEMP1	res	1;
BSR_TEMP1		res 1;

CITAC			res 1;

POM1			res 1;	;pomocna promenna

BITS			res 1;

POL0			res 1;
POL1			res 1;
POL2			res 1;
POL3			res 1;

;-- deklarace promennych pro hardverovou nasobicku
ARG1L			res 1;
ARG1H			res 1;
ARG2L			res 1;
ARG2H			res 1;

RES0			res 1;
RES1			res 1;
RES2			res 1;
RES3			res 1;
;-- konec deklarace promennych pro hw nasobicku


K0		equ	0x0E;	zadane polynomy
K1		equ	0x02;	kazdy si je
K2		equ	0x0F;	musi upravit podle zadani, pozor jsou v HEX

K_TMRL	equ 0x61;	kalibracni konstanty pro casovac
K_TMRH	equ	0x2A;	kazdy si je musi spocitat sam



#define POLYNOM BITS, 7	;nastavujeme priznak na pocitani polynomu
#define	CITAT   BITS, 6 ;udrzuje priznak zdali citat, nastavuje se v low int
#define NULOVANI BITS, 5; udrzuje priznak zdali nulovat, nastavuje se v low int
#define CITAT_TMP BITS, 4 ; urzuje priznak zdali jsme jiz pri stisknutem tlacitku zmenili citaci bit
#define	ZMENA	PORTA, RA5;
#define STST	PORTB, RB0;

; zatim neni potreba #define CITAT	BITS, 0; //prizna zdali inkrementujeme citac


	org		0x0000; zacatek programu
	goto	Main;
	
	org		0x0008; vektor preruseni
	goto	HightInt;

	org		0x0018; vejtor low interupt;
	goto	LowInt;

	org     0x0020;
HightInt:
	movwf	WREG_TMP;
	movff	STATUS, STATUS_TEMP;	
	movff	BSR, BSR_TEMP;
	;--- uprava casovace, cyklus konci trive nez by docital
	movlw	K_TMRH;
	movwf	TMR0H
	movlw	K_TMRL;
	movwf	TMR0L;	zde teprve dojde k uprave registru citace

	;--- zde se provadi prace s citacem
	btfsc	CITAT	; pokud neni nastaven priznak necitame, ani nepocitame polynom
	goto	HightIntKonec
	incf	CITAC,F	;inkrementujeme citac
	bsf		POLYNOM ; potrebujeme prepocitat polynom


HightIntKonec:
	bcf		INTCON, TMR0IF
	movff	BSR_TEMP, BSR;
	movf	WREG_TMP,W;
	movff	STATUS_TEMP, STATUS;
	retfie;navrat z  preruseni

LowInt:
	movwf	WREG_TMP1;
	movff	STATUS, STATUS_TEMP1;	
	movff	BSR, BSR_TEMP1;
	bcf		PIR1, TMR1IF
	btfss	STST		; pokud stisknuto pokracujeme, 
	goto	StartStopKonec ; jinak na konec start stop
	btfsc	CITAT_TMP	; byla uz hodnota po stisku zmenena? 
	goto	StartStopKonec ; pokud ano koncime StartStop
	btg		CITAT;		;invertujeme bit na citani
	bsf		CITAT_TMP   ; na toto stisknuti jsme jiz reagovali
StartStopKonec:		;Start Stop zde nekonci, jeste nulujeme CITAT_TMP
	btfss	STST	;pokud je bit v 0 provede se resetovani bitu CITAT_TMP
	bcf		CITAT_TMP	; uzivatel pustil tlacitko, pripravme se na dalsi zmacknuti

	btfsc	ZMENA		; pokud je stisknuto tlacitko pokracujeme dal
	goto	ZmenaKonec	;jinak skaceme na konec
	movlw	0x00;
	movwf	CITAC
ZmenaKonec:
	
	movff	BSR_TEMP1, BSR;
	movf	WREG_TMP1,W;
	movff	STATUS_TEMP1, STATUS;
	retfie;navrat z  preruseni

Main:
	call init;
Zobraz:
	movf	CITAC,W;
	movwf	PORTD;
	btfss	NULOVANI;	budeme resetovat cita?
	goto	ZapisPort	;ne nebudeme
	clrf	CITAC;
	bcf		NULOVANI;

ZapisPort:
	movf	TMR0L, W;
	btfss	POLYNOM		;mame prepocitat polynom ?
	goto	Zobraz;		;pokud ne zobrazujem, pokud ano pocitame
	;---- pocitani polynomu
	;y = K2 * x^2  + K1*x + K0

	nop;
	nop;	
	movf	CITAC,W;
	movwf	ARG1L
	movwf	ARG2L
	call mul8		;vypocteme x^2;
	movff	RES0, ARG1L
	movff	RES1, ARG1H
	movlw	K2;
	movwf	ARG2L;
	clrf	ARG2H;
	call	mul16  ;vypocteme (x^2) * K2
	movff	RES0, POL0;
	movff	RES1, POL1;
	movff	RES2, POL2;
	movff	RES3, POL3;	ulozime vysledek prvniho vypoctu

	movlw	K1;		
	movwf	ARG1L;
	movff	CITAC,ARG2L;
	call	mul8;	vpocteme K1 * x
	
	movff	RES0,ARG1L
	movff	RES1,ARG1H
	call	add_pol		;pricteme k polyomu
	movlw	K0
	movwf	ARG1L
	clrf	ARG1H
	call	add_pol		;pricteme posledni kontantu k polynomu
						;pote se v promennych pol0,1,2,3 nachazi vysledek
	bcf		POLYNOM		;smazeme priznak pocitani poluynomu
	goto	Zobraz



init:	;inicializacni funkce, provede nastaveni portu
		; delicky a preruseni.
	movlw	0x00;
	movwf	CITAC;  nulovani citace po resetu
	movwf	TRISD;	//pord D jako vystu
	movlw	0xff;
	movwf	TRISB;	//ostatni jako vstup
	movwf	TRISA;
	
	movwf	TMR0L;	vynulujeme registr tmr0, at nam hned nepretece

	movlw	b'11100000'
;povolit int,povolit low int, povolit TMR0 int
;external interupt zakazat, ostatni je 0;
	movwf	INTCON;

;nastavit tmr0 do high int
	bsf		INTCON2, TMR0IP
	
	movlw	b'00000100'
	movwf	INTCON2;
	
	movlw	b'10000000'
	movwf	RCON;
;nastaveni casovace
	movlw	b'10000100'
	movwf	T0CON
;nastaveni casovace tmr0
	movlw	b'01001101'
	movwf	T1CON
;nastavit tmr1 do low intterupt
	bcf		IPR1, TMR1IP
;povolit tmr1 interrupt 
	bsf		PIE1, TMR1IE



	return;		


;---- provede pricteni k polynomu, hlida si prenos do vyssiho radu
;---- parametry jsou ARG1L(H)
add_pol:
	movf	ARG1L,W;
	addwf	POL0,F;
	btfss	STATUS,C
	goto neni_low
	incf	POL1,F
	btfss	STATUS,C
	goto neni_low
	incf	POL2,F
	btfss	STATUS,C
	goto	neni_low
	incf	POL3,F	;ten by nikdy nemel pretyct
neni_low:
	movf	ARG1H,W;
	addwf	POL1,F;
	btfss	STATUS,C
	goto	neni_high
	incf	POL2,F
	btfss	STATUS,C
	goto 	neni_high
	incf	POL3,F
neni_high:
	return;

;---- provede nasobeni 16 x 16b, vysledek je 32b
;---- parametry ARG1L(H) * ARG2L(H)
;---- vraci v RES0,1,2,3
;---- FUNKCE JE PREVZATA Z DATASHEETU MICROCHIP,
;---- netreba studovat jeji princip. Je to nejkratsi moznej zpusob
mul16:
	MOVF	ARG1L, W
	MULWF	ARG2L ; ARG1L * ARG2L->
	; PRODH:PRODL
	MOVFF	PRODH, RES1 ;
	MOVFF	PRODL, RES0 ;

	MOVF	ARG1H, W
	MULWF	ARG2H ; ARG1H * ARG2H->
	; PRODH:PRODL
	MOVFF	PRODH, RES3 ;
	MOVFF	PRODL, RES2 ;

	MOVF	ARG1L, W
	MULWF	ARG2H ; ARG1L * ARG2H->
;	 PRODH:PRODL
	MOVF	PRODL, W ;
	ADDWF	RES1, F ; Add cross
	MOVF	PRODH, W ; products
	ADDWFC	RES2, F ;
	CLRF	WREG ;
	ADDWFC	RES3, F ;

	MOVF	ARG1H, W ;
	MULWF	ARG2L ; ARG1H * ARG2L->
	; PRODH:PRODL
	MOVF	PRODL, W ;
	ADDWF	RES1, F ; Add cross
	MOVF	PRODH, W ; products
	ADDWFC	RES2, F ;
	CLRF	WREG ;
	ADDWFC	RES3, F ;
	return
;---- provede nasobeni 8 x 8b, vysledek je 16b;
;---- parametry ARG1L x ARG2L
;---- vysledk v RES0,1
;---- FUNKCE JE PREVZATA Z DATASHEETU MICROCHIP,
;---- netreba studovat jeji princip. Je to nejkratsi moznej zpusob
mul8:
	MOVF	ARG1L, W ;
	MULWF	ARG2L ; ARG1 * ARG2 ->
	movff	PRODH,RES1
	movff	PRODL,RES0;
	return
; PRODH:PRODL


	

	END;